home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / sound / players / mp02_tar.z / mp02_tar / mp02 / setsb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-05  |  1.3 KB  |  66 lines

  1. /* set 128 SoundBlaster voices from patches in a Glib library;
  2.    e.g.:
  3.     setsb default.sb
  4.                 --gl
  5. */
  6. #include <stdio.h>
  7. #include <linux/soundcard.h>
  8. #include <fcntl.h>
  9.  
  10. #define SBVOICESIZE 52
  11. #define SBOFFSET 0x24
  12.  
  13. char   *basename ();
  14.  
  15. main(int argc, char *argv[])
  16. {    int sb, f, c, n, v;
  17.     int first_voice = 0, num_voices = 128;
  18.     struct sbi_instrument instr;
  19.     char *progname;
  20.     char buf[52];
  21.  
  22.     progname = basename (argv[0]);
  23.     if (!strcmp(progname,"setdrums")) {
  24.         first_voice = 128;
  25.         num_voices = 16;
  26.     }
  27.  
  28.     if (argc != 2) {
  29.         fprintf(stderr,"library file?\n");
  30.         exit(1);
  31.     }
  32.     if ((f = open(argv[1], O_RDONLY, 0)) == -1) {
  33.         fprintf(stderr,"can't find that library file\n");
  34.         exit(1);
  35.     }
  36.     if ((sb=open("/dev/sequencer", O_WRONLY, 0)) == -1) {
  37.         fprintf(stderr,"can't open sequencer device\n");
  38.         exit(1);
  39.     }
  40.     for (v = 0; v < num_voices; v++) {
  41.         if (read(f, buf, SBVOICESIZE) != SBVOICESIZE) {
  42.             fprintf(stderr,"short library file\n");
  43.             exit(1);
  44.         }
  45.         instr.channel = v + first_voice;
  46.         for (n = SBOFFSET; n < SBVOICESIZE; n++)
  47.             instr.operators[n - SBOFFSET] = buf[n];
  48.         if (ioctl(sb, SNDCTL_FM_LOAD_INSTR, &instr) == -1) {
  49.             fprintf(stderr,"can't load instrument %d\n", v);
  50.             exit(1);
  51.         }
  52.     }
  53. }
  54.  
  55. char   *basename (s)
  56. char   *s;
  57. {
  58.     char   *p;
  59.  
  60.     if (p = (char *)strrchr (s, '/'))
  61.         return (++p);
  62.     else
  63.         return (s);
  64. }                /* basename */
  65.  
  66.